Disabling/Pausing Queries
禁用自动运行查询,可以说使用enabled = false
选项。
当enabled
为false
时:
- 如果查询具有缓存数据,则查询将在
status === 'success'
或isSuccess
状态下初始化。 - 如果查询没有缓存数据,则查询将在
status === 'loading'
和fetchStatus === 'idle'
状态下开始。 - 查询不会在挂载时自动获取数据。
- 查询不会在后台自动重新获取数据。
- 查询将忽略查询客户端的
invalidateQueries
和refetchQueries
调用,这些调用通常会导致查询重新获取。 - 从
useQuery
返回的refetch
可以用于手动触发查询。
永久禁用查询会使您无法使用TanStack Query提供的许多优秀功能(如后台重新获取),并且这也不是惯用的方式。它将您从声明性方法(在定义查询何时运行时定义依赖项)转变为命令式模式(无论何时单击此处,都会进行获取)。还无法传递参数进行重新获取。通常,您只需要一个(延迟查询)lazy query来推迟初始获取:
Lazy Queries(延迟查询)
enabled选项不仅可用于永久禁用查询,还可以在以后的某个时间启用/禁用它。(条件启用enabled)
function Todos() {
const [filter, setFilter] = React.useState('')
const { data } = useQuery({
queryKey: ['todos', filter],
queryFn: () => fetchTodos(filter),
// ⬇️ disabled as long as the filter is empty
enabled: !!filter
})
return (
<div>
// 🚀 applying the filter will enable and execute the query
<FiltersForm onApply={setFilter} />
{data && <TodosTable data={data}} />
</div>
)
}
isInitialLoading (禁用或者延迟查询情况下loading 指示)
延迟查询在开始时将处于status: 'loading'
状态,因为loading意味着尚无数据。从技术上讲,这是正确的,然而,由于我们当前没有获取任何数据(因为查询未启用),这也意味着您可能无法使用此标志显示加载指示器
如果您正在使用禁用或延迟查询,可以使用isInitialLoading标志。它是一个派生标志,通过以下计算得出:
isLoading && isFetching
因此,只有在查询首次进行获取时才会为true。